import Vue from 'vue'
import HotentUi from 'hotent-ui/src'
import utils from 'hotent-ui/src/utils.js'
import wangeditor from 'hotent-ui/packages/plugins/wangeditor'
import Echarts from 'hotent-ui/packages/plugins/Echarts'
import Map from 'hotent-ui/packages/plugins/Map'
import Qrcode from 'hotent-ui/packages/plugins/Qrcode'
import XLSX from 'hotent-ui/packages/plugins/XLSX'

import i18n from './vue-i18n.js'
import request from '$exp/utils/request'

const eipPath = 'http://192.168.1.59:8088'
const manage = 'http://192.168.1.120:8080/mvue'
const front = 'http://192.168.1.120/front'
const mobile = 'http://192.168.1.120:8082/mobilevue'
const model = eipPath
const form = eipPath
const uc = eipPath
const flow = eipPath
const portal = eipPath
const runtime = eipPath

let rr = null

const getUserId = () => {
  return '1'
}

const getAccount = () => {
  return 'admin'
}
const getToken = () => {
  return rr
}
// 模拟token在初始时无法获取的情况
setTimeout(() => {
  rr =
    'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsInRlbmFudElkIjoiLTEiLCJleHAiOjE2NjI3NzM0NDYsImlhdCI6MTY2MjY4NzA0Nn0.0WgR8s1w0L2mMjVVES7iB1aheXJYx0h2S9zJKwdYtAqxLU-KsizKYG8HGg_LdcKnVVcwZmIrAVxywgd0VKtlHQ'
}, 200)

const requestConfig = {
  /**1.全局设置 start ****************************************************************/
  baseUrl: form,
  // 管理端地址
  manageUrl: manage,
  // 应用端地址
  frontUrl: front,
  // 移动端地址
  mobileUrl: mobile,
  // 流程建模地址
  bpmModelUrl: model,
  // 表单地址
  formUrl: form,
  // 用户中心地址
  ucUrl: uc,
  // 流程运行时地址
  flowUrl: flow,
  // 门户地址
  portalUrl: portal,

  /** 用户信息获取 start */
  getToken,
  getUserId,
  getAccount,
  /** 用户信息获取 end */

  // 附件处理的头部信息
  header: () => {
    return {
      Authorization: getToken(),
    }
  },
  // 通用查询
  request: (params) => {
    params.url = utils.parseExp(params.url, { form, portal })
    return request(params)
  },
  // 获取服务器当前时间
  getCurrentServerTime: (format) => {
    return request({
      url: `${form}/base/tools/v1/getCurrentDate?valFormat=${format}`,
    }).then((resp) => {
      return resp.value
    })
  },

  // 通用返回事件
  goBack: () => {
    Vue.prototype.$message.success(`返回事件`)
  },
  //通用获取图片base64地址
  getImgSrc: (fileId) => {
    return request({
      url: `${portal}/file/onlinePreviewController/v1/getFileById_${fileId}`,
      method: 'get',
      responseType: 'blob',
    })
  },
  /**全局设置 end ********************************************************************/

  /**2.表单设置 start ****************************************************************/
  // 获取关联查询定义
  getCustomQuery: (alias) => {
    return request({
      url: `${form}/form/customQuery/v1/getByAlias`,
      method: 'post',
      data: alias,
    })
  },
  // 通过表单ID获取表单数据（包括bpmForm,permission,data)
  getFormById: (formId) => {
    return request({
      url: `${form}/form/form/v1/previewDesignVue?formId=${formId}`,
    })
  },
  // 通过id获取图表
  getChartById: (id) => {
    return request({
      url: `${form}/form/customChart/v1/get/${id}`,
    })
  },
  // 获取图表的列表数据
  getChartListData: (alias, params) => {
    return request({
      url: `${form}/form/customChart/v1/getListData?alias=${alias}`,
      method: 'post',
      data: params,
    })
  },
  //获取业务数据模板信息
  getBpmDataTemplateInfo(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/getBpmDataTemplateInfo?alias=${
        data.templateKey
      }&needDisplayFileds=${data.needDisplayFileds ? true : false}`,
      method: 'get',
    })
  },
  //获取业务数据模板列表模板html
  getTemplateDataListForm(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/dataList_${data}`,
      method: 'post',
      data: {},
    })
  },
  //根据别名获取树形自定义对话框数据
  getCustomDialogTreeData(alias) {
    return request({
      url: `${form}/form/customDialog/v1/getTreeData?alias=${alias}&mapParam=`,
      method: 'get',
    })
  },
  //获取业务数据模板子表信息
  getSubEntsByFormKey(formKey) {
    return request({
      url: `${form}/form/form/v1/getSubEntsByFormKey?formKey=${formKey}`,
      method: 'get',
    })
  },
  //导入主表数据
  dataTemplateMainImport(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/newImport?alias=${
        data.alias
      }&bindFilld=${data.bindFilld || ''}&fillValue=${
        data.fillValue || ''
      }&refIdValue=${data.refIdValue || ''}`,
      data: data.data,
      method: 'post',
    })
  },
  //导出子表数据
  dataTemplateSubExport(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/exportSub`,
      method: 'post',
      data: data,
      responseType: 'arraybuffer',
    })
  },
  //根据别名获取自定义对话框
  getCustomDialogByAlias(alias) {
    return request({
      url: `${form}/form/customDialog/v1/getByAlias?alias=${alias}`,
      method: 'get',
    })
  },
  //表单列表子表导入
  dataTemplateSubImport(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/importSub?refId=${data.refId}&alias=${data.alias}`,
      method: 'post',
      data: data.data,
    })
  },
  //根据表单ID获取流程实例对象
  getDataTemplateDataList(param) {
    return request({
      url: `${form}/form/dataTemplate/v1/listJson`,
      method: 'post',
      data: param,
    })
  },
  //删除表单列表的bo数据
  deleteTemplateDataById(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/boDel/${data.boAlias}?ids=${data.ids}`,
      method: 'delete',
    })
  },
  //表单列表下载导入模板
  downloadTempFile(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/downloadTempFile/${data}`,
      method: 'post',
      responseType: 'arraybuffer',
    })
  },
  //根据表单列表别名获取导入日志
  getImportLogData(data) {
    return request({
      url: `${form}/form/formDataTemplateImportLog/v1/listJson`,
      method: 'post',
      data,
    })
  },
  //业务数据模板导出
  templateExport(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/export?formKey=${data.boAlias}&getType=${data.getType}&filterKey=${data.filterKey}&expField=${data.expField}`,
      method: 'post',
      data: data.query,
      responseType: 'arraybuffer',
    })
  },
  //业务数据模板导出
  exportByBtnSetting(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/exportByBtnSetting?id=${data.id}`,
      method: 'post',
      data: data.params,
      responseType: 'arraybuffer',
    })
  },
  //获取表单列表的子表数据
  getDataTemplateSubData(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/getSubDataPagination?alias=${data.name}&refId=${data.refId}`,
      method: 'post',
      data: data.pagination,
    })
  },
  //保存表单bo数据
  boSave(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/boSave/${data.templateKey}/${
        data.boAlias
      }?delDraftId=${data.delDraftId || ''}`,
      method: 'post',
      data: data.boData,
    })
  },
  boSaveDraft(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/boSaveDraft`,
      method: 'post',
      data: data,
    })
  },
  boCopy(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/boCopy`,
      method: 'post',
      data: data,
    })
  },
  //获取业务数据模板信息
  batchUpdateTemplateData(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/boBatchUpdate/${data.boAlias}`,
      method: 'post',
      data: data.boData,
    })
  },
  //获取表单列表导入后的日志列表
  getDataTemplateImportLogData(param) {
    return request({
      url: `${form}/form/formDataImportLog/v1/listJson`,
      method: 'post',
      data: param,
    })
  },
  //根据表单Key, boAlias 获取表单html， 权限， bo数据结构
  getDataTemplateForm(
    formAlias,
    dataDefAlias,
    pkVal,
    action,
    recordId,
    dataKey
  ) {
    return request({
      url: `${form}/form/dataTemplate/v1/getForm/${formAlias}/${dataDefAlias}?id=${pkVal}&action=${
        action || 'get'
      }&recordId=${recordId || ''}&dataKey=${dataKey || ''}`,
      method: 'get',
    })
  },
  //获取业务数据模板表单草稿数据
  getTempDraftData(data) {
    return request({
      url: `${form}/form/dataTemplate/v1/getTempDraftData/${data}`,
      method: 'get',
    })
  },
  // 下载子表导入模板
  downloadSubtableTemplate: (subDesc, columns) => {
    return request({
      url: encodeURI(`${form}/form/form/v1/exportFormSub?subDesc=${subDesc}`),
      method: 'post',
      data: columns,
      responseType: 'arraybuffer',
    })
  },
  //获取自定义sql视图定义
  getQuerySqlView(viewId) {
    return request({
      url: `${form}/form/query/queryView/getJson?id=${viewId}`,
      method: 'get',
    })
  },
  //获取数据列表的数据
  getQueryViewDataList(param) {
    return request({
      url: `${form}/form/query/queryView/data_${param.sqlAlias}/${param.alias}`,
      data: param.param,
      method: 'post',
    })
  },
  //自定义sql查询视图数据导出
  querySqlViewExport(data) {
    return request({
      url: `${form}/form/query/queryView/export?sqlAlias=${data.sqlAlias}&alias=${data.alias}&getType=${data.getType}&expField=${data.expField}`,
      method: 'post',
      data: data.query,
      responseType: 'arraybuffer',
    })
  },
  getTemplateImportResult(cacheKey, data) {
    return request({
      url: `${form}/form/dataTemplate/v1/getImportCache?cacheKey=${cacheKey}`,
      method: 'get',
      data,
    })
  },
  getBoDefinition(id) {
    return request({
      url: `${form}/bo/def/v1/getJson?id=${id}`,
      method: 'get',
    })
  },
  saveImportResult(cacheKey, templateKey) {
    return request({
      url: `${form}/form/dataTemplate/v1/saveImportResult?templateAlias=${templateKey}`,
      data: cacheKey,
      method: 'post',
    })
  },
  /**表单设置 end ********************************************************************/

  /**3.用户中心设置 start ************************************************************/
  // 获取当前登录用户
  getCurrentUser: (type) => {
    const account = getAccount()
    type = type || 'user'
    return request({
      url: `${uc}/api/user/v1/user/getDetailByAccountOrId`,
      data: { accountOrId: account },
      method: 'post',
    }).then((data) => {
      const result = data[type]
      if (type == 'post') {
        return result ? Object.values(result)[0] : null
      }
      return result && result.constructor == Array ? result[0] : result
    })
  },
  // 获取用户列表数据
  getUserList: (params) => {
    return request({
      url: `${uc}/api/user/v1/users/queryUserWithMainOrgPost`,
      method: 'post',
      data: params,
    })
  },
  //获取外部系统
  getExtSys: (params) => {
    return request({
      url: `${portal}/portalBizSystem/v1/queryData`,
      method: 'post',
      data: params,
    })
  },
  // 获取组织列表数据
  getOrgList: (params) => {
    return request({
      url: `${uc}/api/org/v1/orgs/getOrgPage`,
      method: 'post',
      data: params,
    })
  },
  // 获取角色列表数据
  getRoleList: (params) => {
    return request({
      url: `${uc}/api/role/v1/roles/getRolePage`,
      method: 'post',
      data: params,
    })
  },
  // 获取岗位列表数据
  getPostList: (params) => {
    return request({
      url: `${uc}/api/org/v1/orgPosts/getOrgPostPage`,
      method: 'post',
      data: params,
    })
  },
  // 获取职务列表数据
  getJobList: (params) => {
    return request({
      url: `${uc}/api/job/v1/jobs/getJobPage`,
      method: 'post',
      data: params,
    })
  },
  // 获取所有维度
  getAllDemensions: () => {
    return request({
      url: `${uc}/api/demension/v1/dems/getAll`,
    })
  },
  //获取维度列表数据
  getDimensionList: (params) => {
    return request({
      url: `${uc}/api/demension/v1/dems/getDemListAll`,
      method: 'post',
      data: params,
    })
  },
  // 获取组织树
  getOrgTree: (params) => {
    return request({
      url: `${uc}/api/org/v1/orgs/getByParentAndDem`,
      method: 'post',
      data: params,
    })
  },
  // 获取用户的权限配置
  getUserRightMapByIds(data) {
    return request({
      url: `${uc}/api/user/v1/user/getUserRightMapByIds?ids=${data}`,
      method: 'get',
    })
  },
  // 获取常用联系人群组
  getContactGroup(data) {
    return request({
      url: `${uc}/uc/ucGroup/v1/query`,
      method: 'post',
      data,
    })
  },
  // 获取常用联系人
  getContactUser(data) {
    let url = `${uc}/uc/ucGroupUser/v1/loadUserByGroupId`
    if (data.contactGroupId) {
      url = `${url}?groupIds=${data.contactGroupId}`
    }
    return request({
      url,
      method: 'post',
      data,
    })
  },
  // 获取指定用户所属组织列表
  getOrgListByUserId(userId) {
    const url = `${uc}/api/org/v1/orgs/getOrgListByUserId?userId=${userId}`
    return request({ url, method: 'get' })
  },
  /**用户中心设置 end ****************************************************************/

  /**4.流程设置 start ****************************************************************/

  // 处理相关流程中点击某个流程的事件
  handleRelevantFlowClick: (flow) => {
    Vue.prototype.$message.success(`查看id为${flow.id}的流程实例`)
  },
  //根据表单ID获取流程实例对象
  getInstanceByPks(pks, boDefAlias, flowKey) {
    return request({
      url: `${flow}/runtime/instance/v1/getInstanceByPks?boDefAlias=${boDefAlias}&flowKey=${flowKey}`,
      method: 'post',
      data: pks,
    })
  },
  //通过bo数据发起流程
  startForm(data) {
    return request({
      url: `${flow}/runtime/instance/v1/startForm?defKey=${data.defKey}&businessKey=${data.businessKey}&boAlias=${data.boAlias}&templateAlias=${data.templateAlias}`,
      method: 'post',
      data: {},
    })
  },
  // 获取相关流程
  getRelevantFlow: (query) => {
    return request({
      url: `${flow}/runtime/instance/v1/relatedProcess`,
      method: 'post',
      data: query,
    })
  },
  //根据流程实例Id获取代办任务
  getBpmTaskByInstId(instId) {
    return request({
      url: `${flow}/runtime/task/v1/getBpmTaskByInstId?instId=${instId}`,
      method: 'get',
    })
  },
  //获取待阅
  getNoticeTodoReadList(param) {
    return request({
      url: `${flow}/runtime/task/v1/getNoticeTodoReadList`,
      method: 'post',
      data: param,
    })
  },
  //获取已阅
  getNoticeDoneReadList(param) {
    return request({
      url: `${flow}/runtime/task/v1/getNoticeDoneReadList`,
      method: 'post',
      data: param,
    })
  },
  //获取已阅沟通
  getMyNoticeReadList(param) {
    return request({
      url: `${flow}/runtime/task/v1/getNoticeDoneReadList`,
      method: 'post',
      data: param,
    })
  },
  //流程表单数据修改记录列表地址
  boDataModifyRecord(param) {
    return request({
      url: `${flow}/bpm/boDataModifyRecord/v1/listJson`,
      method: 'post',
      data: param,
    })
  },
  //启动流程
  start(data) {
    return request({
      url: `${flow}/runtime/instance/v1/start`,
      method: 'post',
      data: data,
    })
  },
  //获取表单列表相关权限
  getDataTemplateButtonPermission(instIds, types) {
    return request({
      url: `${flow}/runtime/instance/v1/getDataTemplateButtonPermission?permissionTypes=${types}`,
      data: instIds,
      method: 'post',
    })
  },
  //获取流程实例明细
  instanceFlowImage(data, cb) {
    request({
      url: `${flow}/runtime/instance/v1/instanceFlowImage?proInstId=${
        data.instId
      }&nodeId=${data.nodeId || ''}&type=${data.type || ''}&defId=${
        data.defId || ''
      }`,
      method: 'get',
    }).then((response) => {
      cb(response)
    })
  },
  //流程图
  getBpmImage(id, proInstId, defId, cb) {
    request({
      url: `${flow}/runtime/instance/v1/getBpmImage?taskId=&proInstId=${proInstId}&defId=${defId}&bpmnInstId=${id}`,
    }).then((response) => {
      cb(response)
    })
  },
  //获取审批意见
  getNodeOpinions(data, cb) {
    request({
      url: `${flow}/runtime/task/v1/nodeOpinion?instId=${data.instId}&nodeId=${data.nodeIds}&defId=${data.defId}`,
    }).then((response) => {
      cb(response)
    })
  },
  //获取处理记录列表
  getOpinionsById(data) {
    return request({
      url: `${flow}/runtime/instance/v1/instanceFlowOpinions`,
      method: 'get',
      params: data,
    })
  },
  // 根据别名获取DIY组件
  getFormCustomComponentByAlias(alias) {
    return request({
      url: `${form}/formCustomComponent/v1/getByAlias?alias=${alias}`,
    })
  },
  //删除流程实例
  removeFlowById(id) {
    return new Promise((resolve) => {
      request({
        url: `${flow}/runtime/instance/v1/remove?ids=${id}`,
        method: 'delete',
      }).then((response) => {
        resolve(response)
      })
    })
  },
  saveRevoke(data) {
    return new Promise((resolve) => {
      request({
        url: `${flow}/runtime/instance/v1/revokeInstance`,
        method: 'post',
        data,
      }).then((response) => {
        resolve(response)
      })
    })
  },
  //获取审批常用语
  getCommonWordsByDefKeyAndTypeId(defKey) {
    const url = `${model}/flow/approvalItem/v1/getApprovalByDefKeyAndTypeId?defKey=${defKey}`
    return request({
      url,
      method: 'get',
    })
  },
  //保存常用语
  savaCommonWords(data) {
    return request({
      url: `${model}/flow/approvalItem/v1/save`,
      method: 'post',
      data,
    })
  },
  transToMore(data) {
    return request({
      url: `${flow}/runtime/instance/v1/transToMore`,
      method: 'post',
      data,
    })
  },
  /**流程设置 end ********************************************************************/

  /**5.门户设置 start ****************************************************************/
  // 附件上传地址
  uploadUrl: `${portal}/system/file/v1/upload`,
  // 附件下载处理
  download: (fileId) => {
    return request({
      url: `${portal}/system/file/v1/downloadFile?fileId=${fileId}`,
      method: 'get',
      responseType: 'arraybuffer',
    })
  },
  // 获取数据字典
  getDictionaryByKey: (key) => {
    return request({
      url: `${portal}/sys/dataDict/v1/getByTypeKeyForComBo?typeKey=${key}`,
      method: 'post',
    })
  },
  // 获取标签数据
  getTagList: (params) => {
    return request({
      url: `${portal}/portal/sysTag/v1/query`,
      method: 'post',
      data: params,
    })
  },
  // 添加标签
  saveTag: (params) => {
    return request({
      url: `${portal}/portal/sysTag/v1/save`,
      method: 'post',
      data: params,
    })
  },
  getNextIdByAlias: (alias) => {
    return request({
      url: `${portal}/sys/identity/v1/getNextIdByAlias?alias=${alias}`,
      method: 'get',
    })
  },
  /**门户设置 end ********************************************************************/

  /**6.前端跳转 start ****************************************************************/
  // 二维码组件获取当前流程实例、任务的页面地址
  getQrcodeUrl: () => {
    return new Promise((resolve) => {
      resolve('http://hotent.com')
    })
  },
  //获取当前移动端地址
  getBaseMobileUrl: () => {
    return mobile
  },
  openUrl: (param) => {
    // bizType:业务类型,openType:打开方式,parameters:参数(json格式)
    const { bizType, openType, parameters } = param

    let path = ''
    if (bizType == 'searchData') {
      //表单列表预览中的查询数据按钮功能
      const previewTemplateAlias = parameters.previewTemplateAlias
      const data = parameters.data
      const key =
        Date.parse(new Date()) + '_' + Math.ceil(Math.random() * 99999)
      path = `${manage}/templatePreview/${previewTemplateAlias}/${data}/${key}`
    } else if (bizType == 'startFlow') {
      const data = parameters.data
      let token = ''
      const authToken = getToken()
      if (authToken && authToken.indexOf(' ') > -1) {
        token = authToken.split(' ')[1]
      }
      path = `${front}/matter/startProcess?token=${token}&defId=${parameters.defId}&data=${data}`
    } else if (bizType == 'addData') {
      //表单列表预览中的查询数据按钮功能
      const previewTemplateAlias = parameters.previewTemplateAlias
      const data = parameters.data
      path = `${manage}/templateForm/${previewTemplateAlias}/add/${data}`
    }

    if (openType == 'new') {
      window.open(path, '_blank')
    } else {
      window.location.href = path
    }
  },
  // 跳转其他表单列表页面的地址构建
  viewReportURLHandler: ({ item }) => {
    return new Promise((resolve, reject) => {
      request({
        url: `${portal}/sys/sysMenu/v1/getFirstMenuRouterPathByTemplateAlias?templateAlias=${item.alias}`,
      })
        .then((result) => {
          if (result.state) {
            resolve(result.value)
          } else {
            reject(result.message)
          }
        })
        .catch((err) => reject(err))
    })
  },
  /**前端跳转 end *******************************************************************/
  // 后端校验
  backendValidate: (data) => {
    let params = {}
    if (data.submitFormData == 'true') {
      let formElementAry = document.getElementsByName('online-form')
      if (formElementAry && formElementAry.length == 1) {
        let frmInst = formElementAry[0].__vue__
        params = frmInst.data
      }
    }
    data.url = utils.parseUrl(data.url)
    return new Promise((resolve) => {
      request({
        url: data.url + data.param,
        data: params,
        method: 'post',
      }).then((response) => {
        resolve(response)
      })
    })
  },
  //执行后端脚本
  executeScript: (params) => {
    return request({
      url: `${runtime}/runtime/script/v1/executeScript`,
      method: 'post',
      data: params,
    })
  },
  //附件预览
  filePreview: (fileId) => {
    return `${portal}/onlinePreview?fileId=${fileId}&token=${getTokenOnly()}`
  },
}

Vue.use(HotentUi, {
  i18n: (key, value) => i18n.t(key, value),
  requestConfig,
})
Vue.use(wangeditor, {
  uploadImgServer: `${portal}/system/file/v1/editor/fileUpload`,
  uploadImgHeaders: {
    Authorization: getToken,
  },
  uploadImgHooks: {
    customInsert: function (insertImgFn, result) {
      result.data &&
        result.data.forEach((data) => {
          let src = data.url
          if (src && !src.startsWith('http')) {
            src = `${portal}/system/file/v1/downloadFile?fileId=${src}`
          }
          insertImgFn(src)
        })
    },
  },
})
Vue.use(Echarts)
Vue.use(Map)
Vue.use(Qrcode)
Vue.use(XLSX)
